/**
 * 任务管理API服务
 * 提供任务相关的所有API操作
 */

import { BaseService } from '../base-service.js';
import { API_ENDPOINTS } from '../config.js';

class TaskService extends BaseService {
  constructor() {
    super(API_ENDPOINTS.TASKS.LIST.replace('/tasks', '/tasks'));
  }

  /**
   * 获取任务列表
   * @param {object} params - 查询参数
   * @param {number} params.page - 页码
   * @param {number} params.pageSize - 每页数量
   * @param {string} params.search - 搜索关键词
   * @param {string} params.projectId - 项目ID筛选
   * @param {string} params.status - 状态筛选
   * @param {string} params.priority - 优先级筛选
   * @param {string} params.assigneeId - 负责人ID筛选
   * @param {string} params.startDate - 开始日期筛选
   * @param {string} params.endDate - 结束日期筛选
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 任务列表数据
   */
  async getTasks(params = {}, options = {}) {
    return this.getList(params, options);
  }

  /**
   * 获取任务详情
   * @param {string|number} id - 任务ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 任务详情
   */
  async getTask(id, options = {}) {
    return this.getDetail(id, options);
  }

  /**
   * 创建任务
   * @param {object} taskData - 任务数据
   * @param {string} taskData.task_name - 任务名称
   * @param {string} taskData.description - 任务描述
   * @param {string} taskData.project_id - 项目ID
   * @param {string} taskData.assignee_id - 负责人ID
   * @param {Array} taskData.participants - 参与者ID数组
   * @param {string} taskData.start_date - 开始日期
   * @param {string} taskData.end_date - 结束日期
   * @param {number} taskData.estimated_hours - 预估工时
   * @param {string} taskData.priority - 优先级
   * @param {Array} taskData.predecessor_tasks - 前置任务ID数组
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 创建结果
   */
  async createTask(taskData, options = {}) {
    return this.create(taskData, options);
  }

  /**
   * 更新任务
   * @param {string|number} id - 任务ID
   * @param {object} taskData - 任务数据
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateTask(id, taskData, options = {}) {
    return this.update(id, taskData, options);
  }

  /**
   * 更新任务状态
   * @param {string|number} id - 任务ID
   * @param {string} status - 新状态 (pending, in_progress, completed, cancelled)
   * @param {string} reason - 状态变更原因
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateTaskStatus(id, status, reason = '', options = {}) {
    return this.patch(id, { 
      status,
      status_change_reason: reason,
      status_changed_at: new Date().toISOString()
    }, options);
  }

  /**
   * 更新任务进度
   * @param {string|number} id - 任务ID
   * @param {number} progress - 进度百分比
   * @param {string} comment - 进度备注
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateTaskProgress(id, progress, comment = '', options = {}) {
    return this.patch(id, { 
      progress_percentage: Math.max(0, Math.min(100, progress)),
      progress_comment: comment,
      progress_updated_at: new Date().toISOString()
    }, options);
  }

  /**
   * 更新任务工时
   * @param {string|number} id - 任务ID
   * @param {number} actualHours - 实际工时
   * @param {string} comment - 工时备注
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateTaskHours(id, actualHours, comment = '', options = {}) {
    return this.patch(id, { 
      actual_hours: actualHours,
      hours_comment: comment,
      hours_updated_at: new Date().toISOString()
    }, options);
  }

  /**
   * 分配任务
   * @param {string|number} id - 任务ID
   * @param {string} assigneeId - 负责人ID
   * @param {Array} participants - 参与者ID数组
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 分配结果
   */
  async assignTask(id, assigneeId, participants = [], options = {}) {
    return this.patch(id, { 
      assignee_id: assigneeId,
      participants,
      assigned_at: new Date().toISOString()
    }, options);
  }

  /**
   * 删除任务
   * @param {string|number} id - 任务ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteTask(id, options = {}) {
    return this.delete(id, options);
  }

  /**
   * 批量删除任务
   * @param {Array<string|number>} ids - 任务ID数组
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async batchDeleteTasks(ids, options = {}) {
    return this.batchDelete(ids, options);
  }

  /**
   * 批量更新任务状态
   * @param {Array<string|number>} ids - 任务ID数组
   * @param {string} status - 新状态
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async batchUpdateTaskStatus(ids, status, options = {}) {
    const updates = ids.map(id => ({
      id,
      data: { 
        status,
        status_changed_at: new Date().toISOString()
      }
    }));
    return this.batchUpdate(updates, options);
  }

  /**
   * 获取任务统计信息
   * @param {object} params - 统计参数
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 统计数据
   */
  async getTaskStats(params = {}, options = {}) {
    return this.getStats(params, options);
  }

  /**
   * 获取项目任务列表
   * @param {string|number} projectId - 项目ID
   * @param {object} params - 查询参数
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 任务列表
   */
  async getProjectTasks(projectId, params = {}, options = {}) {
    return this.getList({
      ...params,
      project_id: projectId,
    }, options);
  }

  /**
   * 获取用户任务列表
   * @param {string|number} userId - 用户ID
   * @param {object} params - 查询参数
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 任务列表
   */
  async getUserTasks(userId, params = {}, options = {}) {
    return this.getList({
      ...params,
      assignee_id: userId,
    }, options);
  }

  /**
   * 获取任务依赖关系
   * @param {string|number} taskId - 任务ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 依赖关系
   */
  async getTaskDependencies(taskId, options = {}) {
    return this.getDetail(`${taskId}/dependencies`, options);
  }

  /**
   * 添加任务依赖
   * @param {string|number} taskId - 任务ID
   * @param {string|number} predecessorId - 前置任务ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 添加结果
   */
  async addTaskDependency(taskId, predecessorId, options = {}) {
    return this.create(`${taskId}/dependencies`, { 
      predecessor_task_id: predecessorId 
    }, options);
  }

  /**
   * 删除任务依赖
   * @param {string|number} taskId - 任务ID
   * @param {string|number} dependencyId - 依赖ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async removeTaskDependency(taskId, dependencyId, options = {}) {
    return this.delete(`${taskId}/dependencies/${dependencyId}`, options);
  }

  /**
   * 获取任务评论
   * @param {string|number} taskId - 任务ID
   * @param {object} params - 查询参数
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 评论列表
   */
  async getTaskComments(taskId, params = {}, options = {}) {
    return this.getDetail(`${taskId}/comments`, {
      query: params,
      ...options,
    });
  }

  /**
   * 添加任务评论
   * @param {string|number} taskId - 任务ID
   * @param {string} content - 评论内容
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 添加结果
   */
  async addTaskComment(taskId, content, options = {}) {
    return this.create(`${taskId}/comments`, { 
      content 
    }, options);
  }

  /**
   * 删除任务评论
   * @param {string|number} taskId - 任务ID
   * @param {string|number} commentId - 评论ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteTaskComment(taskId, commentId, options = {}) {
    return this.delete(`${taskId}/comments/${commentId}`, options);
  }

  /**
   * 获取任务文件
   * @param {string|number} taskId - 任务ID
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 文件列表
   */
  async getTaskFiles(taskId, options = {}) {
    return this.getFiles(taskId, options);
  }

  /**
   * 上传任务文件
   * @param {string|number} taskId - 任务ID
   * @param {File|FileList} files - 文件
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 上传结果
   */
  async uploadTaskFiles(taskId, files, options = {}) {
    return this.uploadFiles(taskId, files, options);
  }

  /**
   * 删除任务文件
   * @param {string|number} taskId - 任务ID
   * @param {string} fileId - 文件ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteTaskFile(taskId, fileId, options = {}) {
    return this.deleteFile(taskId, fileId, options);
  }

  /**
   * 获取任务甘特图数据
   * @param {string|number} projectId - 项目ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 甘特图数据
   */
  async getTaskGanttData(projectId, options = {}) {
    return this.getDetail(`/gantt/${projectId}`, options);
  }

  /**
   * 获取任务看板数据
   * @param {string|number} projectId - 项目ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 看板数据
   */
  async getTaskKanbanData(projectId, options = {}) {
    return this.getDetail(`/kanban/${projectId}`, options);
  }

  /**
   * 复制任务
   * @param {string|number} taskId - 任务ID
   * @param {object} copyData - 复制配置
   * @param {string} copyData.name - 新任务名称
   * @param {boolean} copyData.copy_dependencies - 是否复制依赖
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 复制结果
   */
  async copyTask(taskId, copyData, options = {}) {
    return this.create(`${taskId}/copy`, copyData, options);
  }

  /**
   * 移动任务到其他项目
   * @param {string|number} taskId - 任务ID
   * @param {string|number} newProjectId - 新项目ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 移动结果
   */
  async moveTaskToProject(taskId, newProjectId, options = {}) {
    return this.patch(taskId, { 
      project_id: newProjectId,
      moved_at: new Date().toISOString()
    }, options);
  }

  /**
   * 获取任务时间线
   * @param {string|number} taskId - 任务ID
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 时间线数据
   */
  async getTaskTimeline(taskId, options = {}) {
    return this.getDetail(`${taskId}/timeline`, options);
  }

  /**
   * 获取任务工作量统计
   * @param {object} params - 查询参数
   * @param {string} params.userId - 用户ID
   * @param {string} params.startDate - 开始日期
   * @param {string} params.endDate - 结束日期
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 工作量统计
   */
  async getTaskWorkloadStats(params = {}, options = {}) {
    return this.getDetail('/workload-stats', {
      query: params,
      ...options,
    });
  }
}

// 创建单例实例
export const taskService = new TaskService();

export default TaskService;
